<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/1/9
 * Time: 10:08
 */
/**
 * 系统公共库文件
 * 主要定义系统公共函数库
 */

/**
 * 获取当前页面完整URL地址
 */
function get_url() {
    $sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
    $php_self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
    $path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
    $relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : $path_info);
    return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
}
/**
 * 字符串截取，支持中文和其他编码
 * @static
 * @access public
 * @param string $str 需要转换的字符串
 * @param string $start 开始位置
 * @param string $length 截取长度
 * @param string $charset 编码格式
 * @param string $suffix 截断显示字符
 * @return string
 */
function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = true) {
    if (function_exists("mb_substr"))
        $slice = mb_substr($str, $start, $length, $charset);
    elseif (function_exists('iconv_substr')) {
        $slice = iconv_substr($str, $start, $length, $charset);
        if (false === $slice) {
            $slice = '';
        }
    } else {
        $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
        $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
        $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
        $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
        preg_match_all($re[$charset], $str, $match);
        $slice = join("", array_slice($match[0], $start, $length));
    }
    return $suffix ? $slice . '...' : $slice;
}
/**
 * 系统加密方法
 * @param string $data 要加密的字符串
 * @param string $key 加密密钥
 * @param int $expire 过期时间 单位 秒
 * @return string
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function think_encrypt($data, $key = '', $expire = 0) {
    $key = md5(empty($key) ? C('DATA_AUTH_KEY') : $key);
    $data = base64_encode($data);
    $x = 0;
    $len = strlen($data);
    $l = strlen($key);
    $char = '';

    for ($i = 0; $i < $len; $i++) {
        if ($x == $l)
            $x = 0;
        $char .= substr($key, $x, 1);
        $x++;
    }

    $str = sprintf('%010d', $expire ? $expire + time() : 0);

    for ($i = 0; $i < $len; $i++) {
        $str .= chr(ord(substr($data, $i, 1)) + (ord(substr($char, $i, 1))) % 256);
    }
    return str_replace(array('+', '/', '='), array('-', '_', ''), base64_encode($str));
}

/**
 * 系统解密方法
 * @param  string $data 要解密的字符串 （必须是think_encrypt方法加密的字符串）
 * @param  string $key 加密密钥
 * @return string
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function think_decrypt($data, $key = '') {
    $key = md5(empty($key) ? C('DATA_AUTH_KEY') : $key);
    $data = str_replace(array('-', '_'), array('+', '/'), $data);
    $mod4 = strlen($data) % 4;
    if ($mod4) {
        $data .= substr('====', $mod4);
    }
    $data = base64_decode($data);
    $expire = substr($data, 0, 10);
    $data = substr($data, 10);

    if ($expire > 0 && $expire < time()) {
        return '';
    }
    $x = 0;
    $len = strlen($data);
    $l = strlen($key);
    $char = $str = '';

    for ($i = 0; $i < $len; $i++) {
        if ($x == $l)
            $x = 0;
        $char .= substr($key, $x, 1);
        $x++;
    }

    for ($i = 0; $i < $len; $i++) {
        if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
            $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
        } else {
            $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
        }
    }
    return base64_decode($str);
}
/**
 * 对查询结果集进行排序
 * @access public
 * @param array $list 查询结果
 * @param string $field 排序的字段名
 * @param array $sortby 排序类型
 * asc正向排序 desc逆向排序 nat自然排序
 * @return array
 */
function list_sort_by($list, $field, $sortby = 'asc') {
    if (is_array($list)) {
        $refer = $resultSet = array();
        foreach ($list as $i => $data)
            $refer[$i] = &$data[$field];
        switch ($sortby) {
            case 'asc': // 正向排序
                asort($refer);
                break;
            case 'desc':// 逆向排序
                arsort($refer);
                break;
            case 'nat': // 自然排序
                natcasesort($refer);
                break;
        }
        foreach ($refer as $key => $val)
            $resultSet[] = &$list[$key];
        return $resultSet;
    }
    return false;
}

/**
 * 去除二维数组中相同元素与数组重复值实例
 * @param $arr  二维数组
 * @param $key  去重的字段
 * @return mixed   返回新的二维数组
 */
function assoc_title($arr, $key)
{
    $tmp_arr = array();
    foreach ($arr as $k => $v) {
        if (in_array($v[$key], $tmp_arr)) {
            unset($arr[$k]);
        } else {
            $tmp_arr[] = $v[$key];
        }
    }
    return $arr;
}


/**
 * 删除文件目录下的所有文件及空目录
 * @param $path 目录
 */
 function DeleteDir($path){
    $dir=opendir($path);
    while(($file=readdir($dir)) !== false){
        if($file!='.' && $file!='..'){
            $filepath=$path.'/'.$file;
            if(is_dir($filepath)){
                DeleteDir($filepath);
            }else{
                unlink($filepath);
            }
        }
    }
    closedir($dir);
    rmdir($path);
}
///**
// * 下载远程图片
// * @param string $url 图片的绝对url
// * @param string $filepath 文件的完整路径（例如/www/images/test） ，此函数会自动根据图片url和http头信息确定图片的后缀名
// * @param string $filename 要保存的文件名(不含扩展名)
// * @return mixed 下载成功返回一个描述图片信息的数组，下载失败则返回false
// */
// function downloadImage($url, $filepath, $filename) {
//    //服务器返回的头信息
//    $responseHeaders = array();
//    //原始图片名
//    $originalfilename = '';
//    //图片的后缀名
//    $ext = '';
//    $ch = curl_init($url);
//    //设置curl_exec返回的值包含Http头
//    curl_setopt($ch, CURLOPT_HEADER, 1);
//    //设置curl_exec返回的值包含Http内容
//    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//    //设置抓取跳转（http 301，302）后的页面
//    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//    //设置最多的HTTP重定向的数量
//    curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
//
//    //服务器返回的数据（包括http头信息和内容）
//    $html = curl_exec($ch);
//    //获取此次抓取的相关信息
//    $httpinfo = curl_getinfo($ch);
//    curl_close($ch);
//    if ($html !== false) {
//        //分离response的header和body，由于服务器可能使用了302跳转，所以此处需要将字符串分离为 2+跳转次数 个子串
//        $httpArr = explode("\r\n\r\n", $html, 2 + $httpinfo['redirect_count']);
//        //倒数第二段是服务器最后一次response的http头
//        $header = $httpArr[count($httpArr) - 2];
//        //倒数第一段是服务器最后一次response的内容
//        $body = $httpArr[count($httpArr) - 1];
//        $header.="\r\n";
//
//        //获取最后一次response的header信息
//        preg_match_all('/([a-z0-9-_]+):\s*([^\r\n]+)\r\n/i', $header, $matches);
//        if (!empty($matches) && count($matches) == 3 && !empty($matches[1]) && !empty($matches[1])) {
//            for ($i = 0; $i < count($matches[1]); $i++) {
//                if (array_key_exists($i, $matches[2])) {
//                    $responseHeaders[$matches[1][$i]] = $matches[2][$i];
//                }
//            }
//        }
//        //获取图片后缀名
//        if (0 < preg_match('{(?:[^\/\\\\]+)\.(jpg|jpeg|gif|png|bmp)$}i', $url, $matches)) {
//            $originalfilename = $matches[0];
//            $ext = $matches[1];
//        } else {
//            if (array_key_exists('Content-Type', $responseHeaders)) {
//                if (0 < preg_match('{image/(\w+)}i', $responseHeaders['Content-Type'], $extmatches)) {
//                    $ext = $extmatches[1];
//                }
//            }
//        }
//        //保存文件
//        if (!empty($ext)) {
//            //如果目录不存在，则先要创建目录
//            if(!is_dir($filepath)){
//                mkdir($filepath, 0777, true);
//            }
//            $filepath .= '/'.$filename.".$ext";
//            $local_file = fopen($filepath, 'w');
//            if (false !== $local_file) {
//                if (false !== fwrite($local_file, $body)) {
//                    fclose($local_file);
//                    $sizeinfo = getimagesize($filepath);
//                    return array('filepath' => realpath($filepath), 'width' => $sizeinfo[0], 'height' => $sizeinfo[1], 'orginalfilename' => $originalfilename, 'filename' => pathinfo($filepath, PATHINFO_BASENAME));
//                }
//            }
//        }
//    }
//    return false;
//}

/**
 * 下载文件
 * @param $file 文件路径绝对路径
 */
function download_file($file){
    if(is_file($file)){
        $length = filesize($file);
        $type = mime_content_type($file);
        $showname =  ltrim(strrchr($file,'/'),'/');
        header("Content-Description: File Transfer");
        header('Content-type: ' . $type);
        header('Content-Length:' . $length);
        if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) { //for IE
            header('Content-Disposition: attachment; filename="' . rawurlencode($showname) . '"');
        } else {
            header('Content-Disposition: attachment; filename="' . $showname . '"');
        }
        readfile($file);
        exit;
    } else {
        exit('文件已被删除！');
    }
}

/**
 * 利用正则表达式实现手机号码中间4位用星号（*）替换显示
 * @param $phone  号码
 * @return mixed 返回加*号码
 */
function hidtel($phone){
    $IsWhat = preg_match('/(0[0-9]{2,3}[\-]?[2-9][0-9]{6,7}[\-]?[0-9]?)/i',$phone); //固定电话
    if($IsWhat == 1){
        return preg_replace('/(0[0-9]{2,3}[\-]?[2-9])[0-9]{3,4}([0-9]{3}[\-]?[0-9]?)/i','$1****$2',$phone);
    }else{
        return  preg_replace('/(1[34758]{1}[0-9])[0-9]{4}([0-9]{4})/i','$1****$2',$phone);
    }
}
